package negocio.bd;

import base.Equipo;
import java.sql.SQLException;
import java.util.ArrayList;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 * Clase que representa el almacen de equipos en la base de datos.
 * @author Efren
 * @since 25/02/2013
 * @version 0.1.1
 */
public class BDAlmacenEquipos {
    public static final String idEquipo = "idEquipo";
    public static final String idTarea = "idTarea";
    public static final String numeroSerie = "numeroSerie";
    public static final String marca = "marca";
    public static final String modelo = "modelo";
    public static final String fechaEntrega = "fechaEntrega";
    public static final String fechaRecogida = "fechaRecogida";
    public static final int buscarPorIdEquipo = 1;
    public static final int buscarPorIdTarea = 2;
    public static final int buscarPorNumeroSerie = 3;
    public static final int buscarPorMarca = 4;
    public static final int buscarPorModelo = 5;
    public static final int buscarPorFechaEntrega = 6;
    public static final int buscarPorFechaRecogida = 7;
    public static final int ASC = 1;
    public static final int DESC = 2;
    
    /**
     * Método para buscar en los datos de equipos almacenados.
     * @param campoBusqueda entero que indica el campo por el que se va a buscar.
     * @param busqueda cadena a buscar.
     * @param orden entero que indica el orden.
     * @param exacta indica si la consulta usará like o = para realizar la busqueda.
     * @return 
     */
    public static Equipo[]  buscar(int campoBusqueda, String busqueda, int orden, boolean exacta){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Equipo> equipos = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`AlmacenEquipos` ";
        switch (campoBusqueda){
            case buscarPorNumeroSerie:
                query += "WHERE " +numeroSerie + " like " + busqueda + "% ORDER BY " + numeroSerie;
                break;
            case buscarPorIdTarea:
                query += "WHERE " + idTarea + " like " + busqueda + "% ORDER BY " + idTarea;
                break;
            case buscarPorMarca:
                query += "WHERE " + marca + " like " + busqueda + "% ORDER BY " + marca;
                break;
            case buscarPorModelo:
                query += "WHERE " + modelo + " like " + busqueda + "% ORDER BY " + modelo;
                break;
            case buscarPorFechaEntrega:
                query += "WHERE " + fechaEntrega + " like " + busqueda + "% ORDER BY " + fechaEntrega;
                break;
            case buscarPorFechaRecogida:
                query += "WHERE " + fechaRecogida + " like " + busqueda + "% ORDER BY " + fechaRecogida;
                break;
            default:
                query += "WHERE " +idEquipo + " like " + busqueda + "% ORDER BY " + idEquipo;
        }
        //Si la busqueda a de ser exacta quitar like y % de la consulta
        if (exacta){
            query = query.replaceAll("like", "=");
            query = query.replace("%", "");
        }
        if (orden == DESC){
            query += " DESC";
        } else {
            query += " ASC";
        }
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Equipo temp = new Equipo();
                temp.setIdEquipo(res.getLong(idEquipo));
                temp.setIdTarea(res.getLong(idTarea));
                temp.setNumeroSerie(res.getString(numeroSerie));
                temp.setMarca(res.getString(marca));
                temp.setModelo(res.getString(modelo));
                temp.setFechaEntrega(ConversorFecha.obtenerFecha(res.getString(fechaEntrega)));
                if (res.getString(fechaRecogida) != null){
                    temp.setFechaRecogida(ConversorFecha.obtenerFecha(res.getString(fechaRecogida)));
                }
                equipos.add(temp);
            }
            return equipos.toArray(new Equipo[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    /**
     * 
     * @param idEquipo
     * @return 
     */
    public static Equipo obtener(long idEquipo){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`AlmacenEquipos` WHERE " + BDAlmacenEquipos.idEquipo + " = " + idEquipo);
            while (res.next()){
                Equipo temp = new Equipo();
                temp.setIdEquipo(res.getLong(BDAlmacenEquipos.idEquipo));
                temp.setIdTarea(res.getLong(idTarea));
                temp.setNumeroSerie(res.getString(numeroSerie));
                temp.setMarca(res.getString(marca));
                temp.setModelo(res.getString(modelo));
                temp.setFechaEntrega(ConversorFecha.obtenerFecha(res.getString(fechaEntrega)));
                if (res.getString(fechaRecogida) != null){
                    temp.setFechaRecogida(ConversorFecha.obtenerFecha(res.getString(fechaRecogida)));
                }
                return temp;
            }
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean existe(long idEquipo){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`AlmacenEquipos` WHERE " + BDAlmacenEquipos.idEquipo + " = " + idEquipo);
            if (res.next()){
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    public static Equipo[] obtenerTodos(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Equipo> equipos = new ArrayList<>(0);
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`AlmacenEquipos`");
            while (res.next()){
                Equipo temp = new Equipo();
                temp.setIdEquipo(res.getLong(idEquipo));
                temp.setIdTarea(res.getLong(idTarea));
                temp.setNumeroSerie(res.getString(numeroSerie));
                temp.setMarca(res.getString(marca));
                temp.setModelo(res.getString(modelo));
                temp.setFechaEntrega(ConversorFecha.obtenerFecha(res.getString(fechaEntrega)));
                if (res.getString(fechaRecogida) != null){
                    temp.setFechaRecogida(ConversorFecha.obtenerFecha(res.getString(fechaRecogida)));
                }
                equipos.add(temp);
            }
            return equipos.toArray(new Equipo[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean insertar(Equipo equipo){
        if (!existe(equipo.getIdEquipo())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`. `AlmacenEquipos` (`idTarea` ,`numeroSerie` ,`marca` ,`modelo` ,`fechaEntrega`) VALUES (?,?,?,?,?)");
                insert.setLong(1, equipo.getIdTarea());
                insert.setString(2, equipo.getNumeroSerie());
                insert.setString(3, equipo.getMarca());
                insert.setString(4, equipo.getModelo());
                insert.setString(5, ConversorFecha.getFechaFormatoBD(equipo.getFechaRecogida()));
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    public static boolean actualizar(Equipo equipo){
        if (existe(equipo.getIdEquipo())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE `gestionTienda`.`AlmacenEquipos` SET " + idTarea + " = ? ," + marca + " = ? ,"+ modelo + " = ? ," + numeroSerie + " = ? ,"+ fechaRecogida + " = ? ," + fechaEntrega +" = ? WHERE " + BDAlmacenEquipos.idEquipo + " = ?");
                update.setLong(1, equipo.getIdTarea());
                update.setString(2, equipo.getMarca());
                update.setString(3, equipo.getModelo());
                update.setString(4, equipo.getNumeroSerie());
                update.setString(5, ConversorFecha.getFechaFormatoBD(equipo.getFechaRecogida()));
                update.setString(6, ConversorFecha.getFechaFormatoBD(equipo.getFechaEntrega()));
                update.setLong(7, equipo.getIdEquipo());
                if (update.executeUpdate()==1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
}
